<?php

class TbfImageProcessor {
    /**
     * @param TbfImageObj $obj
     * @param $config
     * @return TbfImageObj
     * @throws Exception
     */
    static function call(TbfImageObj $obj,$config){
        $name = $config[0];
        if (!method_exists(__CLASS__,$name)){
            throw new Exception(sprintf('[TbfImageProcessor.call] name[%s] not found',$name));
        }
        $args = $config;
        array_shift($args);
        $args = array_merge(array($obj),$args);
        return call_user_func_array(array(__CLASS__,$name),$args);
    }
    /*
    //验证图片大小必须为xxx大小
    static function SizeExact(TbfImageObj $obj,$w,$h){
        $originGdImg = $obj->getGdImage();
        $originW = imagesx($originGdImg);
        $originH = imagesy($originGdImg);
        if (($originW!=$w)&&($originH!=$h)){
            TbfError::client(sprintf('图片大小必须为[%dx%d],输入图片大小为[%dx%d]',$w,$h,$originW,$originH));
            return null;
        }
        return $obj;
    }
    */
    /*
     图片缩小
    1.只能会缩小或不变
    2.图片比例不会变化
    3.之后宽和高不会大于最大宽和高
     */
    //减小图片大小,等比缩,可以设置最大宽和最大高
    static function ScaleDown(TbfImageObj $obj,$maxW,$maxH){
        $originGdImg = $obj->getGdImage();
        $originW = imagesx($originGdImg);
        $originH = imagesy($originGdImg);
        if ($originW <= $maxW && $originH <= $maxH){
            return $obj;
        }
        $originRadio = $originW/$originH;
        $afterW = $originW;
        $afterH = $originH;
        if ($afterH>$maxH){
            $afterH = $maxH;
            $afterW = $afterH*$originRadio;
        }
        if ($afterW>$maxW){
            $afterW = $maxW;
            $afterH = $afterW/$originRadio;
        }
        $afterGdImg = imagecreatetruecolor($afterW, $afterH);
        imagecopyresampled($afterGdImg, $originGdImg, 0, 0, 0, 0, $afterW, $afterH, $originW, $originH);
        return TbfImageObj::createFromGdImage($afterGdImg);
    }
    /*
     图片剪切缩小,到目标尺寸
    1.只能缩小或不变
    2.如果比例,图片会从左上角开始挖一块出来
    3.如果图片不能缩小达到需求尺寸,报错
     */
    static function MustScaleDownCut(TbfImageObj $obj,$w,$h){
        $originGdImg = $obj->getGdImage();
        $originW = imagesx($originGdImg);
        $originH = imagesy($originGdImg);
        if ($originW < $w && $originH < $h){
            TbfError::client(sprintf('图片大小至少应该有[%dx%d],输入图片大小为[%dx%d]',$w,$h,$originW,$originH));
            return null;
        }
        return self::ScaleDownCut($obj,$w,$h);
    }
    /*
 图片剪切缩小,到目标尺寸
1.只能缩小或不变
2.如果比例,图片会从左上角开始挖一块出来
3.如果图片不能缩小达到需求尺寸,返回原图,什么也不做
 */
    static function ScaleDownCut(TbfImageObj $obj,$w,$h){
        $originGdImg = $obj->getGdImage();
        $originW = imagesx($originGdImg);
        $originH = imagesy($originGdImg);
        if ($originW == $w && $originH == $h){
            return $obj;
        }
        if ($originW < $w && $originH < $h){
            return $obj;
        }
        $afterRadio = $w/$h;
        $originRadio = $originW/$originH;
        $srcW = $originW;
        $srcX = 0;
        $srcH = $originH;
        $srcY = 0;
        if ($afterRadio>$originRadio){
            //高度要缩小
            $srcH = $originW/$w*$h;
            $srcY = ($originH - $srcH)/2;
        }elseif($afterRadio<$originRadio){
            //宽度要缩小
            $srcW = $originH/$h*$w;
            $srcX = ($originW - $srcW)/2;
        }else{
            //比例一致,截取所有部分,并压缩
        }
        $afterGdImg = imagecreatetruecolor($w, $h);
        imagecopyresampled($afterGdImg, $originGdImg, 0, 0, $srcX, $srcY, $w, $h, $srcW, $srcH);
        return TbfImageObj::createFromGdImage($afterGdImg);
    }
    static function None(TbfImageObj $obj){
        return $obj;
    }
}
